; Dit is de eerste build, dient voornamelijk om de letters om te zetten naar bits

$nolist
$include(../src/lib/reg832.updf)
;$include(/media/WINUX/Elektronica/INCLUDE/aduc800.updf)
$list

; declaratie adressen code

start       equ     00000h  ;deze naam betekent overal in het programma
tim0int		equ		0000bh	;timer0 interrupt adres
tim1int		equ		0001bh	;timer1 interrupt adres
tim2int		equ		0002bh	;timer2 interrupt adres
SPIint		equ		0003bh	;SPI-gedaan interrupt

woordpointH equ		014h	;hier wordt pointer naar woord opgeslagen.
woordpointL	equ		015h	; ""

; declaratie constanten

;cr              equ     00dh            ;ascii code voor wagenterugloop (carriage return)
;lf              equ     00ah            ;ascii code voor line feed (cursor tweede lijn)
cursoff         equ     003h            ;ascii code uitschakelen van de cursor

knop1           equ     07fh            ;code van keyboard routine voor stop
knop2           equ     0bfh            ;code voor U+
knop3           equ     0dfh            ;M+
knop4           equ     0efh            ;M-
knop5			equ		0f7h			;

; adres waar stack zal starten (groeit naar hogere adressen)

stack           equ     07fh            ;vanaf hiet zit de stack in het geheugen
prevkey         equ     018h            ;voor toetsenbord

                org     start           ;hier start hoofdprogramma
                ljmp    main            ;spring er naar toe

				org		tim0int			;hier wordt timer0-interrupt opgevangen
				ljmp	interruptWoord	;interruptWoord wordt gebruikt.

				org		tim1int			;hier wordt timer1-interrupt opgevangen
				ljmp	interruptTijdMeting	

				org		SPIint			;spi-interrupt
				ljmp	SPIinterrupt

main:           mov     pllcon,#0100000b;zet op 16MHz
                //mov     p2,#11111110b	;Dit om te kijken hoe lang het duurt voor initlcd
                mov     sp,#stack       ;stakske verzetten naar betere plaats
                lcall   initlcd         ;lcd initializeren
				lcall	MSGinit			;MSG initializeren
				lcall	LEDinit			;LEDdriver initializeren

                //mov     p2,#01111111b
                ;mov     dptr,#testmsg
                ;lcall   outmsgalcd      ;nieuwe tekstbalk op lcd
				;jmp		$

                ;Test printletterpause (a)
                ;mov     a,#"P"
                ;lcall   printletterpause

				;Test interruptWoordInit
				;ljmp	lijnlus

lus:            lcall	menu
                ;lcall   pause
                ljmp    lus

; wachtHalfSec is subroutine die halve seconde wacht ongeveer
wachtHalfSec:	mov		r2,#75d
wachtHalfSec1:	lcall	delay
				djnz	r2,wachtHalfSec1
				ret

; pause is een subroutine die wacht op het indrukken van een
; toets en dan terugkeert naar het hoofdproces
; doet verder niets belangrijk
pause:			push	acc				;zet accumulator op de stack
wachtOpNul:     lcall   klavier         ;haal toets op
                cjne    a,#0ffh,wachtOpEen  ;indien gelijk aan nul, ga verder
                ljmp     wachtOpNul

wachtOpEen:     lcall   klavier         ;haal toets op
                cjne    a,#0ffh,wachtOpEen  ;indien niet gelijk aan nul, wacht dan
                pop     acc              ;haal accumulator terug van stack
                ret

; klavier is een subroutine die het toetsenbord leest.
; We gebruiken de functietoetsen onder het LCD scherm.
; Afhankelijk van de ingedrukte toets wordt in de accu een
; code doorgegeven. De routine zal ook ontdenderen.

klavier:		mov     a,p3            ;schakelaars inlezen
                orl     a,#00fh         ;laagste bits buiten spel
                cjne    a,#0ffh,klavier1;als niet ff dan ingedrukt
                mov     prevkey,#0ffh   ;aangeven niets ingedrukt voor volgende
                                        ;keer
klavier2:       mov     a,#0ffh
                ret                     ;anders einde
                
klavier1:       lcall   delay           ;ontdenderen
                mov     b,a
                mov     a,prevkey
                cjne    a,#0ffh,klavier2;als niet ff niet verder gaan
                mov     prevkey,b       ;aangeven wel toets ingedrukt
                mov     a,b
                ret

; delay is een kleine tijdsvertraging voor de ontdendering.
; de vertraging duurt ongeveer 10 mS.

delay:          mov     r0,#000h
                mov     r1,#003h
delay1:         djnz    r0,delay1
                djnz    r1,delay1
                ret
                
;;;;;;; Menu
;;
menu:			lcall 	klavier		;Haal toetsenbord op
				cjne	a,#knop1,menu2	;Kijk of het knop1 is.
				lcall	MSGvolgend	;neem volgende message.
				ljmp	menue			;Ga uit menu
				
menu2:			cjne	a,#knop2,menu3	;kijk of het knop2 is
				mov		dph,woordpointH
				mov		dpl,woordpointL
				lcall	IWinit	;doe interruptwoord	
				lcall	interruptWoordStart	;
				ljmp	menue 		;Ga uit menu

menu3:			cjne	a,#knop3,menu4
				mov		a,#0FFh		;zet een op acc
				lcall	LEDstart
				lcall	LEDout
				lcall	LEDstop2
				ljmp	menue

menu4:			cjne	a,#knop4,menue
				lcall	LEDlatch
				ljmp	menue

menu5:			cjne	a,#knop3,menue
				mov		a,#0FFh
				lcall	LEDstart
				lcall	LEDout
				lcall	LEDstop
				ljmp	menue


menue:			ret
				ljmp	menu		;Ga terug naar menu zodat we in loop zitten.

;; MSGvolgend: neem volgende message
; Laatste message afsluiten met dubbel 0.
MSGvolgend:		push	dph
				push	dpl
				push	psw
				push	acc

				mov		dph,woordpointH		;haal huidig woord naar datapointer
				mov		dpl,woordpointL

				;Doorloop het woord
				clr    	a           ;waarde zit in onze weg
              	movc   	a,@a+dptr   ;waarde lezen
				inc		dptr		;ga naar volgende letter
				cjne	a,#000h,$-3	;ga terug naar clr a

				;Lees volgende letter
				clr    	a           ;waarde zit in onze weg
              	movc   	a,@a+dptr   ;waarde lezen
				cjne	a,#000h,MSGvolgend1	;Als niet nul is, ga dan verder
				lcall	MSGinit		;stel terug eerste bericht in.
				jmp		MSGvolgende	;ga naar einde

MSGvolgend1:	mov		woordpointH,dph	;Onthou huidige pointer
				mov		woordpointL,dpl	;Onthou huidige 
				lcall	lengteWoord		;bereken de lengte van het nieuwe woord
				mov		woordlengte,acc	;en onthou het in woordlengte	

MSGvolgend2:	mov		a,#00ah	  	;Ga naar tweede lijn
				lcall	outcharlcd	;print nieuw bericht uit
				lcall	outmsgalcd
				mov		dptr,#spaties	;print lijn vol spaties nu
				lcall	outmsgalcd
				
MSGvolgende:	pop		acc
				pop		psw
				pop		dpl
				pop		dph
				ret

;; MSGinit stelt eerste message in
MSGinit:		push	dph
				push	dpl
				push	psw
				push	acc
				
				mov		dptr,#msg1
				mov		woordpointH,dph
				mov		woordpointL,dpl

				jmp		MSGvolgend2			;Beeindig dit gedoe!


;  Message 1
msg1:		    db " W E L K O M ",0
msg2:			db " D E   N A Y E R ",0	
msg3:			db " L E S S I U S",0
				db " O K E ",0," 3 B A E ",0
msgs:			db " A",0," B ",0," C  ",0," D   ",0,"E     ",0,"A B",0,"A B ",0,0

testmsg:		db lcd04,"a",lcd12,"b",0
spaties:		db "                ",0

; lettertjes
;A
	 
$include(../src/lib/ADuCLCD1.inc) ;includen van de LCD driver
$include(../src/lib/ADuCsio0.inc) ;includen van Serial Input Output
$include(../src/lib/51math2.inc) ;includen van wiskunde met 16 bits
$include(../src/leddriver.inc) ;includen van leddriver
$include(../src/font.inc)      ;includen van lettertype
$include(../src/accelerometer.inc)      ;includen van lettertype


;$include(/media/WINUX/Elektronica/INCLUDE/ADuCLCD1.inc) ;includen van de LCD driver
;$include(/media/WINUX/Elektronica/INCLUDE/ADuCsio0.inc) ;includen van Serial Input Output
;$include(./leddriver.inc)

end